package com.boot2.core.dao.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import javax.validation.constraints.NotNull;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author zhangweilin
 * @date 2019/4/27 10:52
 * @description: 动态数据源切换类
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 抽象数据源，不指定实现
     */
    Map<Object, Object> targetDataSources = new ConcurrentHashMap<>();

    /**
     * 它接收通过DynamicDataSourceHolder设置的新的数据源名称，通过注解@DataSource设置的数据源，也会通过DynamicDataSourceHolder设置，
     * 但是当使用jpa时，情况变的复杂，具体参见@DataSource中的注释
     *
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        String ds = DynamicDataSourceHolder.getContextHolder();
//		System.out.println("ds = " + ds);
        return ds;
    }

    @Override
    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
        super.setTargetDataSources(targetDataSources);
        this.targetDataSources = targetDataSources;
    }

    /**
     * 在业务运行期间,动态添加数据源
     *
     * @param dataSource
     */
    public void addDataSource(@NotNull String key, @NotNull DataSource dataSource) {
        targetDataSources.put(key, dataSource);
        setTargetDataSources(targetDataSources);
        afterPropertiesSet();
    }
}
